const net = require('net');
// net 可以实现 进程之间的🧑‍🎓通信 要满足 ipc协议
// 和 ip/tcp 协议： 服务端 客户端可以  随便发数据 触发 一端断了
// http 协议是 在 ip tcp协议之上的  三次握手 四次挥手是 tcp ip协议搞定的事

// net 是一个通信模块
// net可以实现网络通信 建立在tcp ip 协议之上 建立连接之后 双方可以互传任意格式数据
// http协议：请求之后 响应 下次又得从 请求开始 除非保持长链接 请求响应还需要 满足 http协议的消息格式

// 创建一个  链接：客户端
// 还可以创建一个 服务器
const socket = net.createConnection(
  {
    host: 'duyi.ke.qq.com', // 链接的主机
    port: 80,
  },
  () => {
    console.log('连接成功');
  }
);

// 返回一个 socket 可以理解成一个 特殊的 文件 可以利用流来读取
// socket 向网卡 输送内容  在node 中表现成一个双向流
// 可以向 socket 写内容 发送到服务器  也可以读取服务器返回的内容
// 和流一样的操作

var receive = null;
/**
 * 提炼出响应字符串的消息头和消息体
 * @param {*} response
 */
function parseResponse(response) {
  const index = response.indexOf('\r\n\r\n');
  const head = response.substring(0, index);
  const body = response.substring(index + 2);
  const headParts = head.split('\r\n');
  const headerArray = headParts.slice(1).map((str) => {
    return str.split(':').map((s) => s.trim());
  });
  const header = headerArray.reduce((a, b) => {
    a[b[0]] = b[1];
    return a;
  }, {});
  return {
    header,
    body: body.trimStart(),
  };
}

function isOver() {
  //需要接收的消息体的总字节数
  const contentLength = +receive.header['Content-Length'];
  const curReceivedLength = Buffer.from(receive.body, 'utf-8').byteLength; // 目前接受的 字节数
  console.log(contentLength, curReceivedLength);
  return curReceivedLength > contentLength;
}

socket.on('data', (chunk) => {
  console.log(chunk, '来自服务端端响应');
  // 来自服务器的 流内容
  // 流是 一段一段度的不知道 什么时候 读完
  // 可以判断 响应头里面的 content-length 多大 来是否关闭链接
  // 如果 读取的总内容 大于 content-length 就说明读完了
  const response = chunk.toString('utf-8');
  if (!receive) {
    //第一次
    receive = parseResponse(response);
    if (isOver()) {
      socket.end();
    }
    return;
  }
  receive.body += response; // 存读取的内容
  if (isOver()) {
    socket.end(); // 客户端 挂断
    return;
  }
});

// 和服务器建立 链接后
// 需要向流里面写入 东西  然后 服务器根据写入的消息 处理
// 写一个 满足 http 协议的消息 服务器 看见http协议 服务器可以识别
// 如果服务器是 一个tcp ip 协议 你写其他东西 他也可以识别

// get post 是 http协议的东西 所以写在消息里面
socket.write(`GET / HTTP/1.1
Host: duyi.ke.qq.com
Connection: keep-alive  

`);
// 请求头
//  GET / HTTP/1.1
// Host: duyi.ke.qq.com
// Connection: keep-alive
// 接2个换行  一定要换行 传请求体 不然服务器 拿不到就会一直等待
// 请求体  可以传空
// Connection: keep-alive   先保持 不要断

socket.on('close', () => {
  console.log(receive.body);
  console.log('结束了！');
});
